#对lena的灰度图像Sobel算子边缘检测
# Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT )
# Sobel算子opencv实现  dst = cv.Sobel(src,ddepth,dx,dy[,dst[,ksize[,scale[,delta[,borderType]]]]]])
import cv2 as cv
filename = r'lena.jpg'      #对图像命名
img = cv.imread(filename)    #读入图像
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)   #灰度图像
dst = cv.Sobel(gray,-1, 1, 0, ksize=3)       #用Sobel算子进行边缘检测
cv.imshow("gray",gray)
cv.imshow("Sobel2",dst)
cv.waitKey()
cv.destroyAllWindows()

#对lena的灰度图像Canny算子边缘检测......................................................
# Canny算子的python函数
# dst = cv.Canny(image,threshold1,threshold2[,edges[,apertureSize[,2gradient]]])
import cv2 as cv
filename = r'lena.jpg'
img = cv.imread(filename)                    #读入图像
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)    #将图像灰度值化
dst2 = cv.Canny(gray,10,300)                 #Canny算子对灰度图像进行Canny算子边缘检测
cv.imshow("gray",gray)
cv.imshow("Canny2",dst2)
cv.waitKey()
cv.destroyAllWindows()

#Sobel算子和Canny算子边缘检测结果比较：
#Sobel算子是加权平均滤波的一阶微分算子，其灰度渐变低噪声的图像有较好的检测效果。
# Canny算子可用高斯函数的梯度来近似，在理论上很接近4个指数函数的线性组合形成的最佳边缘算子。
# 因此Canny算子的检测效果优于梯度算子,能够检测出图像较细的边缘部分。从图像中我们也可以看出其边缘轮廓要优于Sobel算子检测的边缘轮廓。
